// cf-590d
// 题意：给定n(<=150)个数，现在可以进行s(<=10^9)次交换操作，每个交换
//       操作可以交换任意相邻两个数，问进行s以内次交换，最左边k(<=n)
//       个数的和最小是多少。
//
// 题解：假设最后的k个数位置分别为a1, a2, ..., ak，那么它们一定是保持
//       原来的左右关系的。把这k个数移到前k个的费用为
//         sigma(ai - i) = sigma(ai)-k*(k+1)/2 <= s
//       也即
//         sigma(ai) <= s + k*(k+1)/2
//       所以原问题也即问从n个数取出k个数满足下标和小于等于(m=s+k*(k+1)/2)，
//       的最小和。
//
//       我们可以令f[i][j][s]表示前i个数取出j个数下标和不超过s的最小和。
//       这个dp是O(n^4)，用滚动数组空间复杂度是O(n^3)。
//
// run: $exec < input
// opt: 0
// flag: -g
#include <iostream>
#include <algorithm>

int const maxn = 200;
int const maxc = maxn * maxn;
int const inf = 1 << 29;
int f[2][maxn][maxc];
int n, k, s;

std::vector<int> a;

int main()
{
	std::ios::sync_with_stdio(false);
	std::cin >> n >> k >> s;
	a.resize(n + 1);
	for (int i = 1; i <= n; i++)
		std::cin >> a[i];
	if (s >= n * (n - 1) / 2) {
		std::sort(a.begin() + 1, a.begin() + n + 1);
		int ans = 0;
		for (int i = 1; i <= k; i++)
			ans += a[i];
		std::cout << ans << '\n';
		return 0;
	}

	int prev = 0, now = 0, m = s + k * (k + 1) / 2;
	for (int i = 0; i < 2; i++)
		for (int j = 1; j <= n; j++)
			for (int t = 0; t <= m; t++) f[i][j][t] = inf;

	for (int i = 1; i <= n; i++) {
		prev = now; now ^= 1;
		for (int j = 1; j <= i; j++) {
			for (int t = 1; t <= m; t++) {
				f[now][j][t] = f[prev][j][t];

#ifdef __DEBUG
				if (t < i) std::cout << "f[" << i << "][" << j << "][" << t << "] = " << f[now][j][t] << '\n';
#endif

				if (t < i) continue;
				f[now][j][t] = std::min(f[now][j][t], f[prev][j - 1][t - i] + a[i]);

#ifdef __DEBUG
				std::cout << "f[" << i << "][" << j << "][" << t << "] = " << f[now][j][t] << '\n';
#endif
			}
		}
	}
	std::cout << f[now][k][m] << '\n';
}

